package com.gis.postgis.geojson.parsers;

import java.util.HashMap;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gis.postgis.geojson.deserializer.GeoJsonDeserializer;
import com.gis.postgis.geojson.introspector.IgnoreJsonTypeInfoIntrospector;

/**
 * 〈功能简述〉<br>
 * 〈〉
 *
 * @author Mr.QL
 * @ClassName BaseIgnoreDeserializerObjectMapper
 * @Date 2022-03-12 22:28
 * @Version 1.0
 */
public abstract class BaseIgnoreDeserializerObjectMapper<T>  {

   /**
    * 反序列化泛型类型
    */
   protected JavaType valueType;

   /**
    * 重装数据后需要忽略当前指定的放序列化实现
    */
   private Class<? extends GeoJsonDeserializer> deserializeClazz;

   /**
    * 忽略自定义反序列化的mapper
    */
   protected ObjectMapper ignoreDeserializerAnnotationMapper;

   public BaseIgnoreDeserializerObjectMapper(JavaType valueType, Class<? extends GeoJsonDeserializer> deserializeClazz) {
      this.valueType = valueType;
      this.deserializeClazz = deserializeClazz;
   }

   public ObjectMapper getIgnoreDeserializerAnnotationMapper(ObjectMapper mapper) {
      if (null == ignoreDeserializerAnnotationMapper) {
         ignoreDeserializerAnnotationMapper = mapper.copy();
         //复制一份mapper config排除自定义注解
         IgnoreJsonTypeInfoIntrospector ignoreJsonTypeInfoIntrospector = new IgnoreJsonTypeInfoIntrospector();
         HashMap<String, Class<? extends GeoJsonDeserializer>> deserializeClazzMap = new HashMap<>();
         Class<?> rawClass = valueType.getRawClass();
         ignoreJsonTypeInfoIntrospector.addIgnoreDeserializeClazz(rawClass.getName(),deserializeClazz);
         ignoreDeserializerAnnotationMapper.setAnnotationIntrospector(ignoreJsonTypeInfoIntrospector);
      }
      return ignoreDeserializerAnnotationMapper;
   }
}
